﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSharpDelegateLambda
{
    /// <summary>
    /// 
    /// Lambda表达式
    /// 1.在Lambda表达式中参数类型可以是明确类型，也可以是推断类型
    /// 2.如果是推断类型，则参数类型可以由编译根据上下文自动推断出来
    /// 3.运算符 => 读作goes to,运算符左边输入参数（如果有），右边是表达式或语句块
    /// 表达式两种方式：
    /// (input args) => 表达式
    /// (input args) => (语句1；语句2；语句3......)
    /// 
    /// 
    /// 
    /// Lambda表达式和匿名方法的比较
    /// 第一：Lambda表达式本身接收匿名方法
    /// 第二：Lambda表达式允许不指明参数类型，但是匿名方法必须要明确
    /// 第三：Lambda表达式允许单一的表达式或多条语句组成，而匿名方法不允许单一表达式
    /// 
    /// 
    /// </summary>
    public class LambdaDemo
    {
        public void Test1()
        {
            CalculatorDelegate cal1 = Add;

            //委托变量可以直接关联一个匿名方法
            CalculatorDelegate cal2 = delegate (int a, int b)
            {
                return a - b;
            };

            CalculatorDelegate cal3 = (int a , int b) => {  return a + b; };

            //进一步简化Lambda表达式的写法（只适合方法体中只有一行代码）
            CalculatorDelegate cal4 = (int a, int b) => a + b;
            CalculatorDelegate cal5 = (a, b) => a + b;

            Console.WriteLine(cal3(10,20));

            SayHelloDelegate sayHello1 = delegate ()
            {
                return ".Net工控开发";
            };

            SayHelloDelegate sayHello2 = () => ".Net工控开发";

            Console.WriteLine(sayHello2());
        }


        private int Add(int a,int b)
        {
            return a + b;
        }

       /* private int Sub(int a,int b)
        {
            return a - b;
        }*/

    }


    //定义两个参数的委托
    public delegate int CalculatorDelegate(int a, int b);

    //定义无参数的委托
    public delegate string SayHelloDelegate();
}
